Racial Wealth Gap

Synopsis

Packages Required

Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ───────────────────────────────────────────── tidyverse 1.3.0 ──
✓ ggplot2 3.3.3     ✓ purrr   0.3.4
✓ tibble  3.1.1     ✓ dplyr   1.0.5
✓ tidyr   1.0.3     ✓ stringr 1.4.0
✓ readr   1.3.1     ✓ forcats 0.5.0
── Conflicts ──────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()

Data Preparation

Data Import

lifetime_earn <- read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/lifetime_earn.csv')

student_debt <- read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/student_debt.csv')

retirement <- read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/retirement.csv')

home_owner <- read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/home_owner.csv')

race_wealth <- read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/race_wealth.csv')

income_time <- read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/income_time.csv')

income_limits <- read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/income_limits.csv')

income_aggregate <- read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/income_aggregate.csv')

income_distribution <- read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/income_distribution.csv')

income_mean <- read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/income_mean.csv')

Data Description

The 10 datasets come from the Urban Institute and US Census.

lifetime_earn.csv:
Average lifetime earning by race/gender

Variable Name Data Class Description
gender character gender column
race character Racial group
lifetime_earn numeric Lifetime earnings

student_dept.csv:
Average family student load debt for aged 25-55, by race and year normalized to 2016 dollars.

Variable Name Data Class Description
year numeric Year of measure
race character Racial group
loan_debt numeric Loan dept
loan_debt_pct numeric Share of families with student loan dept

retirement.csv:
Average family liquid retirement savings normalized to 2016 dollars.

Variable Name Data Class Description
year numeric Year
race character Racial group
retirement numeric Retirement dollars

home_owner.csv:
Home ownership percentage for families.

Variable Name Data Class Description
year numeric Year
race character Racial group
home_owner_pct numeric Home ownership by race/ethnicity

race_wealth.csv:
Family wealth by race/year/measure normalized to 2016, with measures of central tendency with mean and median.

Variable Name Data Class Description
type character Type of measure, either median or mean
year numeric Year
race character Racial group
wealth_family numeric Family wealth

income_time.csv:
Family-level income by percentile and year.

Variable Name Data Class Description
year numeric Year
percentile character Income percentile (10th, 50th, 90th)
income_family numeric Familial income

income_limits.csv:
Familial income limits for each fifth and top 5% of households by year and race.

Variable Name Data Class Description
year numeric Year
race character Racial group
dollar_type character Dollars in that year or normalized to 2019
number numeric Number of households by racial group
income_quintile character Income quintile as well as top 5%
income_dollars numeric Income in US dollars, specific to dollar type

income_aggregate.csv:
Share of aggregate income received by each fifth and top 5% of each racial group/household.

Variable Name Data Class Description
year numeric Year
race character Racial group
number numeric Number of households by racial group
income_quintile character Income quintile and/or top 5%
income_share numeric Income share as a percentage

income_distribution.csv:
Households by total money income, race, and hispanic origin of householder separated by year and income groups.

Variable Name Data Class Description
year numeric Year
race character Racial group
number numeric Number of households
income_median numeric Income median
income_med_moe numeric Income median margin of error
income_mean numeric Income mean
income_mean_moe numeric Income mean margin of error
income_bracket character Income bracket (9 total brackets between <$15,000 and >$200,000
income_distribution numeric Income distribution as the percentage of each year/racial group - should add up to 100 for a specific year and race

income_mean.csv:
Mean income received by each fifth and top 5% of each racial group.

Variable Name Data Class Description
year numeric Year
race character Racial group
dollar_type character Dollar type, i.e. dollar relative to that year or normalized to 2019
income_quintile character Income quintile and/or top 5%
income_dollars numeric Income dollar average

Figuring data out and what to do with it

Exploratory Data Analysis (EDA)

Family Wealth Analysis

Table showing average family wealth by race in 2016

race wealth_family
White 919336.1
Hispanic 191727.3
Black 139523.1

Bar chart showing average family wealth

Retirement Savings Analysis

LS0tCnRpdGxlOiAiUHJvamVjdCIKZGF0ZTogMjAyMS0wNS0wMQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZXZhbCA9IFRSVUUsCiAgZWNobyA9IEZBTFNFKQpgYGAKIyMgUmFjaWFsIFdlYWx0aCBHYXAgey50YWJzZXR9CgojIyMgU3lub3BzaXMKCiMjIyBQYWNrYWdlcyBSZXF1aXJlZAoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGtuaXRyKQpgYGAKCiMjIyBEYXRhIFByZXBhcmF0aW9uIHsudGFic2V0fQoKIyMjIyBEYXRhIEltcG9ydAoKYGBge3IsIGV2YWw9RkFMU0UsIGVjaG89VFJVRX0KbGlmZXRpbWVfZWFybiA8LSByZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDItMDkvbGlmZXRpbWVfZWFybi5jc3YnKQoKc3R1ZGVudF9kZWJ0IDwtIHJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMi0wOS9zdHVkZW50X2RlYnQuY3N2JykKCnJldGlyZW1lbnQgPC0gcmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTA5L3JldGlyZW1lbnQuY3N2JykKCmhvbWVfb3duZXIgPC0gcmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTA5L2hvbWVfb3duZXIuY3N2JykKCnJhY2Vfd2VhbHRoIDwtIHJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMi0wOS9yYWNlX3dlYWx0aC5jc3YnKQoKaW5jb21lX3RpbWUgPC0gcmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTA5L2luY29tZV90aW1lLmNzdicpCgppbmNvbWVfbGltaXRzIDwtIHJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMi0wOS9pbmNvbWVfbGltaXRzLmNzdicpCgppbmNvbWVfYWdncmVnYXRlIDwtIHJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMi0wOS9pbmNvbWVfYWdncmVnYXRlLmNzdicpCgppbmNvbWVfZGlzdHJpYnV0aW9uIDwtIHJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMi0wOS9pbmNvbWVfZGlzdHJpYnV0aW9uLmNzdicpCgppbmNvbWVfbWVhbiA8LSByZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDItMDkvaW5jb21lX21lYW4uY3N2JykKYGBgCgojIyMjIERhdGEgRGVzY3JpcHRpb24KClRoZSAxMCBkYXRhc2V0cyBjb21lIGZyb20gdGhlIFtVcmJhbiBJbnN0aXR1dGVdKGh0dHBzOi8vYXBwcy51cmJhbi5vcmcvZmVhdHVyZXMvd2VhbHRoLWluZXF1YWxpdHktY2hhcnRzLykgYW5kIFtVUyBDZW5zdXNdKGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvZGF0YS90YWJsZXMvdGltZS1zZXJpZXMvZGVtby9pbmNvbWUtcG92ZXJ0eS9oaXN0b3JpY2FsLWluY29tZS1ob3VzZWhvbGRzLmh0bWwpLgoKYGxpZmV0aW1lX2Vhcm4uY3N2YDogIApBdmVyYWdlIGxpZmV0aW1lIGVhcm5pbmcgYnkgcmFjZS9nZW5kZXIKCmBgYHtyfQp2YXIxLnZhcm5hbWUgPC0gY29sbmFtZXMobGlmZXRpbWVfZWFybikKdmFyMS5jbGFzcyA8LSBsYXBwbHkobGlmZXRpbWVfZWFybiwgY2xhc3MpCnZhcjEuZGVzYyA8LSBjKAogICJnZW5kZXIgY29sdW1uIiwKICAiUmFjaWFsIGdyb3VwIiwKICAiTGlmZXRpbWUgZWFybmluZ3MiCikKZGF0YTEuZGVzYyA8LSBhc190aWJibGUoY2JpbmQodmFyMS52YXJuYW1lLCB2YXIxLmNsYXNzLCB2YXIxLmRlc2MpKQpjb2xuYW1lcyhkYXRhMS5kZXNjKSA8LSBjKCJWYXJpYWJsZSBOYW1lIiwgIkRhdGEgQ2xhc3MiLCAiRGVzY3JpcHRpb24iKQprYWJsZShkYXRhMS5kZXNjKQpgYGAKCmBzdHVkZW50X2RlcHQuY3N2YDogIApBdmVyYWdlIGZhbWlseSBzdHVkZW50IGxvYWQgZGVidCBmb3IgYWdlZCAyNS01NSwgYnkgcmFjZSBhbmQgeWVhciBub3JtYWxpemVkIHRvIDIwMTYgZG9sbGFycy4KCmBgYHtyfQp2YXIyLnZhcm5hbWUgPC0gY29sbmFtZXMoc3R1ZGVudF9kZWJ0KQp2YXIyLmNsYXNzIDwtIGxhcHBseShzdHVkZW50X2RlYnQsIGNsYXNzKQp2YXIyLmRlc2MgPC0gYygKICAiWWVhciBvZiBtZWFzdXJlIiwKICAiUmFjaWFsIGdyb3VwIiwKICAiTG9hbiBkZXB0IiwKICAiU2hhcmUgb2YgZmFtaWxpZXMgd2l0aCBzdHVkZW50IGxvYW4gZGVwdCIKKQpkYXRhMi5kZXNjIDwtIGFzX3RpYmJsZShjYmluZCh2YXIyLnZhcm5hbWUsIHZhcjIuY2xhc3MsIHZhcjIuZGVzYykpCmNvbG5hbWVzKGRhdGEyLmRlc2MpIDwtIGMoIlZhcmlhYmxlIE5hbWUiLCAiRGF0YSBDbGFzcyIsICJEZXNjcmlwdGlvbiIpCmthYmxlKGRhdGEyLmRlc2MpCmBgYApgcmV0aXJlbWVudC5jc3ZgOiAgCkF2ZXJhZ2UgZmFtaWx5IGxpcXVpZCByZXRpcmVtZW50IHNhdmluZ3Mgbm9ybWFsaXplZCB0byAyMDE2IGRvbGxhcnMuCgpgYGB7cn0KdmFyMy52YXJuYW1lIDwtIGNvbG5hbWVzKHJldGlyZW1lbnQpCnZhcjMuY2xhc3MgPC0gbGFwcGx5KHJldGlyZW1lbnQsIGNsYXNzKQp2YXIzLmRlc2MgPC0gYygKICAiWWVhciIsCiAgIlJhY2lhbCBncm91cCIsCiAgIlJldGlyZW1lbnQgZG9sbGFycyIKKQpkYXRhMy5kZXNjIDwtIGFzX3RpYmJsZShjYmluZCh2YXIzLnZhcm5hbWUsIHZhcjMuY2xhc3MsIHZhcjMuZGVzYykpCmNvbG5hbWVzKGRhdGEzLmRlc2MpIDwtIGMoIlZhcmlhYmxlIE5hbWUiLCAiRGF0YSBDbGFzcyIsICJEZXNjcmlwdGlvbiIpCmthYmxlKGRhdGEzLmRlc2MpCmBgYAoKYGhvbWVfb3duZXIuY3N2YDogIApIb21lIG93bmVyc2hpcCBwZXJjZW50YWdlIGZvciBmYW1pbGllcy4KCmBgYHtyfQp2YXI0LnZhcm5hbWUgPC0gY29sbmFtZXMoaG9tZV9vd25lcikKdmFyNC5jbGFzcyA8LSBsYXBwbHkoaG9tZV9vd25lciwgY2xhc3MpCnZhcjQuZGVzYyA8LSBjKAogICJZZWFyIiwKICAiUmFjaWFsIGdyb3VwIiwKICAiSG9tZSBvd25lcnNoaXAgYnkgcmFjZS9ldGhuaWNpdHkiCikKZGF0YTQuZGVzYyA8LSBhc190aWJibGUoY2JpbmQodmFyNC52YXJuYW1lLCB2YXI0LmNsYXNzLCB2YXI0LmRlc2MpKQpjb2xuYW1lcyhkYXRhNC5kZXNjKSA8LSBjKCJWYXJpYWJsZSBOYW1lIiwgIkRhdGEgQ2xhc3MiLCAiRGVzY3JpcHRpb24iKQprYWJsZShkYXRhNC5kZXNjKQpgYGAKCmByYWNlX3dlYWx0aC5jc3ZgOiAgCkZhbWlseSB3ZWFsdGggYnkgcmFjZS95ZWFyL21lYXN1cmUgbm9ybWFsaXplZCB0byAyMDE2LCB3aXRoIG1lYXN1cmVzIG9mIGNlbnRyYWwgdGVuZGVuY3kgd2l0aCBtZWFuIGFuZCBtZWRpYW4uCgpgYGB7cn0KdmFyNS52YXJuYW1lIDwtIGNvbG5hbWVzKHJhY2Vfd2VhbHRoKQp2YXI1LmNsYXNzIDwtIGxhcHBseShyYWNlX3dlYWx0aCwgY2xhc3MpCnZhcjUuZGVzYyA8LSBjKAogICJUeXBlIG9mIG1lYXN1cmUsIGVpdGhlciBtZWRpYW4gb3IgbWVhbiIsCiAgIlllYXIiLAogICJSYWNpYWwgZ3JvdXAiLAogICJGYW1pbHkgd2VhbHRoIgopCmRhdGE1LmRlc2MgPC0gYXNfdGliYmxlKGNiaW5kKHZhcjUudmFybmFtZSwgdmFyNS5jbGFzcywgdmFyNS5kZXNjKSkKY29sbmFtZXMoZGF0YTUuZGVzYykgPC0gYygiVmFyaWFibGUgTmFtZSIsICJEYXRhIENsYXNzIiwgIkRlc2NyaXB0aW9uIikKa2FibGUoZGF0YTUuZGVzYykKYGBgCgpgaW5jb21lX3RpbWUuY3N2YDogIApGYW1pbHktbGV2ZWwgaW5jb21lIGJ5IHBlcmNlbnRpbGUgYW5kIHllYXIuCgpgYGB7cn0KdmFyNi52YXJuYW1lIDwtIGNvbG5hbWVzKGluY29tZV90aW1lKQp2YXI2LmNsYXNzIDwtIGxhcHBseShpbmNvbWVfdGltZSwgY2xhc3MpCnZhcjYuZGVzYyA8LSBjKAogICJZZWFyIiwKICAiSW5jb21lIHBlcmNlbnRpbGUgKDEwdGgsIDUwdGgsIDkwdGgpIiwKICAiRmFtaWxpYWwgaW5jb21lIgopCmRhdGE2LmRlc2MgPC0gYXNfdGliYmxlKGNiaW5kKHZhcjYudmFybmFtZSwgdmFyNi5jbGFzcywgdmFyNi5kZXNjKSkKY29sbmFtZXMoZGF0YTYuZGVzYykgPC0gYygiVmFyaWFibGUgTmFtZSIsICJEYXRhIENsYXNzIiwgIkRlc2NyaXB0aW9uIikKa2FibGUoZGF0YTYuZGVzYykKYGBgCgpgaW5jb21lX2xpbWl0cy5jc3ZgOiAgCkZhbWlsaWFsIGluY29tZSBsaW1pdHMgZm9yIGVhY2ggZmlmdGggYW5kIHRvcCA1JSBvZiBob3VzZWhvbGRzIGJ5IHllYXIgYW5kIHJhY2UuCgpgYGB7cn0KdmFyNy52YXJuYW1lIDwtIGNvbG5hbWVzKGluY29tZV9saW1pdHMpCnZhcjcuY2xhc3MgPC0gbGFwcGx5KGluY29tZV9saW1pdHMsIGNsYXNzKQp2YXI3LmRlc2MgPC0gYygKICAiWWVhciIsCiAgIlJhY2lhbCBncm91cCIsCiAgIkRvbGxhcnMgaW4gdGhhdCB5ZWFyIG9yIG5vcm1hbGl6ZWQgdG8gMjAxOSIsCiAgIk51bWJlciBvZiBob3VzZWhvbGRzIGJ5IHJhY2lhbCBncm91cCIsCiAgIkluY29tZSBxdWludGlsZSBhcyB3ZWxsIGFzIHRvcCA1JSIsCiAgIkluY29tZSBpbiBVUyBkb2xsYXJzLCBzcGVjaWZpYyB0byBkb2xsYXIgdHlwZSIKKQpkYXRhNy5kZXNjIDwtIGFzX3RpYmJsZShjYmluZCh2YXI3LnZhcm5hbWUsIHZhcjcuY2xhc3MsIHZhcjcuZGVzYykpCmNvbG5hbWVzKGRhdGE3LmRlc2MpIDwtIGMoIlZhcmlhYmxlIE5hbWUiLCAiRGF0YSBDbGFzcyIsICJEZXNjcmlwdGlvbiIpCmthYmxlKGRhdGE3LmRlc2MpCmBgYAoKYGluY29tZV9hZ2dyZWdhdGUuY3N2YDogIApTaGFyZSBvZiBhZ2dyZWdhdGUgaW5jb21lIHJlY2VpdmVkIGJ5IGVhY2ggZmlmdGggYW5kIHRvcCA1JSBvZiBlYWNoIHJhY2lhbCBncm91cC9ob3VzZWhvbGQuCgpgYGB7cn0KdmFyOC52YXJuYW1lIDwtIGNvbG5hbWVzKGluY29tZV9hZ2dyZWdhdGUpCnZhcjguY2xhc3MgPC0gbGFwcGx5KGluY29tZV9hZ2dyZWdhdGUsIGNsYXNzKQp2YXI4LmRlc2MgPC0gYygKICAiWWVhciIsCiAgIlJhY2lhbCBncm91cCIsCiAgIk51bWJlciBvZiBob3VzZWhvbGRzIGJ5IHJhY2lhbCBncm91cCIsCiAgIkluY29tZSBxdWludGlsZSBhbmQvb3IgdG9wIDUlIiwKICAiSW5jb21lIHNoYXJlIGFzIGEgcGVyY2VudGFnZSIKKQpkYXRhOC5kZXNjIDwtIGFzX3RpYmJsZShjYmluZCh2YXI4LnZhcm5hbWUsIHZhcjguY2xhc3MsIHZhcjguZGVzYykpCmNvbG5hbWVzKGRhdGE4LmRlc2MpIDwtIGMoIlZhcmlhYmxlIE5hbWUiLCAiRGF0YSBDbGFzcyIsICJEZXNjcmlwdGlvbiIpCmthYmxlKGRhdGE4LmRlc2MpCmBgYAoKYGluY29tZV9kaXN0cmlidXRpb24uY3N2YDogIApIb3VzZWhvbGRzIGJ5IHRvdGFsIG1vbmV5IGluY29tZSwgcmFjZSwgYW5kIGhpc3BhbmljIG9yaWdpbiBvZiBob3VzZWhvbGRlciBzZXBhcmF0ZWQgYnkgeWVhciBhbmQgaW5jb21lIGdyb3Vwcy4KCmBgYHtyfQp2YXI5LnZhcm5hbWUgPC0gY29sbmFtZXMoaW5jb21lX2Rpc3RyaWJ1dGlvbikKdmFyOS5jbGFzcyA8LSBsYXBwbHkoaW5jb21lX2Rpc3RyaWJ1dGlvbiwgY2xhc3MpCnZhcjkuZGVzYyA8LSBjKAogICJZZWFyIiwKICAiUmFjaWFsIGdyb3VwIiwKICAiTnVtYmVyIG9mIGhvdXNlaG9sZHMiLAogICJJbmNvbWUgbWVkaWFuIiwKICAiSW5jb21lIG1lZGlhbiBtYXJnaW4gb2YgZXJyb3IiLAogICJJbmNvbWUgbWVhbiIsCiAgIkluY29tZSBtZWFuIG1hcmdpbiBvZiBlcnJvciIsCiAgIkluY29tZSBicmFja2V0ICg5IHRvdGFsIGJyYWNrZXRzIGJldHdlZW4gPCQxNSwwMDAgYW5kID4kMjAwLDAwMCIsCiAgIkluY29tZSBkaXN0cmlidXRpb24gYXMgdGhlIHBlcmNlbnRhZ2Ugb2YgZWFjaCB5ZWFyL3JhY2lhbCBncm91cCAtIHNob3VsZCBhZGQgdXAgdG8gMTAwIGZvciBhIHNwZWNpZmljIHllYXIgYW5kIHJhY2UiCikKZGF0YTkuZGVzYyA8LSBhc190aWJibGUoY2JpbmQodmFyOS52YXJuYW1lLCB2YXI5LmNsYXNzLCB2YXI5LmRlc2MpKQpjb2xuYW1lcyhkYXRhOS5kZXNjKSA8LSBjKCJWYXJpYWJsZSBOYW1lIiwgIkRhdGEgQ2xhc3MiLCAiRGVzY3JpcHRpb24iKQprYWJsZShkYXRhOS5kZXNjKQpgYGAKCmBpbmNvbWVfbWVhbi5jc3ZgOiAgCk1lYW4gaW5jb21lIHJlY2VpdmVkIGJ5IGVhY2ggZmlmdGggYW5kIHRvcCA1JSBvZiBlYWNoIHJhY2lhbCBncm91cC4KCmBgYHtyfQp2YXIxMC52YXJuYW1lIDwtIGNvbG5hbWVzKGluY29tZV9tZWFuKQp2YXIxMC5jbGFzcyA8LSBsYXBwbHkoaW5jb21lX21lYW4sIGNsYXNzKQp2YXIxMC5kZXNjIDwtIGMoCiAgIlllYXIiLAogICJSYWNpYWwgZ3JvdXAiLAogICJEb2xsYXIgdHlwZSwgaS5lLiBkb2xsYXIgcmVsYXRpdmUgdG8gdGhhdCB5ZWFyIG9yIG5vcm1hbGl6ZWQgdG8gMjAxOSIsCiAgIkluY29tZSBxdWludGlsZSBhbmQvb3IgdG9wIDUlIiwKICAiSW5jb21lIGRvbGxhciBhdmVyYWdlIgopCmRhdGExMC5kZXNjIDwtIGFzX3RpYmJsZShjYmluZCh2YXIxMC52YXJuYW1lLCB2YXIxMC5jbGFzcywgdmFyMTAuZGVzYykpCmNvbG5hbWVzKGRhdGExMC5kZXNjKSA8LSBjKCJWYXJpYWJsZSBOYW1lIiwgIkRhdGEgQ2xhc3MiLCAiRGVzY3JpcHRpb24iKQprYWJsZShkYXRhMTAuZGVzYykKYGBgCgojIyMjIEZpZ3VyaW5nIGRhdGEgb3V0IGFuZCB3aGF0IHRvIGRvIHdpdGggaXQKCgojIyMgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyAoRURBKSB7LnRhYnNldH0KCiMjIyMgRmFtaWx5IFdlYWx0aCBBbmFseXNpcwoKKlRhYmxlIHNob3dpbmcgYXZlcmFnZSBmYW1pbHkgd2VhbHRoIGJ5IHJhY2UgaW4gMjAxNioKYGBge3J9CnJhY2Vfd2VhbHRoLm1lYW5zIDwtIHJhY2Vfd2VhbHRoICU+JSBmaWx0ZXIoeWVhciA9PSAnMjAxNicsIHJhY2UgIT0gIk5vbi1XaGl0ZSIsIHR5cGUgPT0gJ0F2ZXJhZ2UnKSAlPiUgc2VsZWN0KHJhY2UsIHdlYWx0aF9mYW1pbHkpICU+JSBncm91cF9ieShyYWNlKSAlPiUgYXJyYW5nZShkZXNjKHJhY2UpKQoKcmFjZV93ZWFsdGgubWVhbnMkcmFjZSA8LSBhc19mYWN0b3IocmFjZV93ZWFsdGgubWVhbnMkcmFjZSkKCmthYmxlKHJhY2Vfd2VhbHRoLm1lYW5zKQpgYGAKKkJhciBjaGFydCBzaG93aW5nIGF2ZXJhZ2UgZmFtaWx5IHdlYWx0aCoKYGBge3J9CnJ3X3Bsb3QgPC0gZ2dwbG90KHJhY2Vfd2VhbHRoLm1lYW5zKSArIGdlb21fYmFyKGFlcyh4PXJhY2UsIHk9d2VhbHRoX2ZhbWlseSwgZmlsbD1yYWNlKSwgc3RhdCA9ICdpZGVudGl0eScpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoMjAwMDAwLCA0MDAwMDAsIDYwMDAwMCwgODAwMDAwKSwgIGxhYmVscyA9IGNvbW1hKSArIGxhYnModGl0bGU9J0F2ZXJhZ2UgRmFtaWx5IHdlYWx0aCBieSByYWNlIGluIDIwMTYnICx4PSdSYWNlJywgeT0nRmFtaWx5IFdlYWx0aCBNZWFuJykKCmdncGxvdGx5KHJ3X3Bsb3QpCmBgYAoKIyMjIyBSZXRpcmVtZW50IFNhdmluZ3MgQW5hbHlzaXMK